#!/bin/bash
#后台执行：
#nohup ./mysql_xtrabackup.sh > backup.out 2>&1 &
set -euo pipefail

START_TIME=$(date +%s)

# 日期和路径变量
DATE=$(date +%F)
BACKUP_DIR="/data/mysqlbackup/fullbackup_$DATE"
ARCHIVE_NAME="mysql_fullbackup_$DATE.tar.gz"
ARCHIVE_PATH="/data/mysqlbackup/$ARCHIVE_NAME"
LOG="/data/mysqlbackup/xtrabackup_$DATE.log"

# Xtrabackup 配置（从环境变量读取，支持默认值）
DATADIR="/data/mysql/mysqldata"
MYSQL_USER="${MYSQL_USER:-backup_user}"
MYSQL_PASS="${MYSQL_PASS:-backup_password}"

# OSS 配置
OSSUTIL="/usr/local/bin/ossutil"
OSS_BUCKET="oss://your_bucket/mysql-backups/"
OSS_ENDPOINT="http://oss-your_region.aliyuncs.com"

# 钉钉机器人 Webhook（替换成你的）
DINGDING_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=your_token"

# 记录日志
log() {
    echo"[$(date '+%F %T')] $1" | tee -a "$LOG"
}
# 发送钉钉消息
send_dingding() {
    local status="$1"
    local msg="$2"
    curl -s "$DINGDING_WEBHOOK" \
        -H 'Content-Type: application/json' \
        -d "{
            \"msgtype\": \"text\",
            \"text\": {
                \"content\": \"MySQL 备份通知：$status\n时间：$(date '+%F %T')\n$msg\"
            }
        }" >/dev/null 2>&1
}

# ========================
# 1. 执行备份
# ========================
if [ -d "$BACKUP_DIR" ]; then
    log"检测到备份目录已存在，跳过 xtrabackup 备份阶段"
else
    log"=== 开始备份 ==="
    if ! xtrabackup --backup \
        --target-dir="$BACKUP_DIR" \
        --datadir="$DATADIR" \
        --user="$MYSQL_USER" \
        --compress \
        --password="$MYSQL_PASS" >> "$LOG" 2>&1; then
        log"备份失败"
        send_dingding "备份失败""步骤：xtrabackup --backup\n错误：执行失败"
        exit 1
    fi
fi

# ========================
# 2. 备份目录打包
# ========================
if [ -f "$ARCHIVE_PATH" ]; then
    log"检测到打包文件已存在，跳过打包阶段"
else
    log"=== 开始打包 ==="
    tar -cf "$ARCHIVE_PATH" -C /data/mysqlbackup "$(basename "$BACKUP_DIR")"
    log"备份打包完成：$ARCHIVE_PATH"
fi

# 计算包大小
ARCHIVE_SIZE=$(du -sh "$ARCHIVE_PATH" | awk '{print $1}')


# ========================
# 3. 上传到 OSS
# ========================
if ! $OSSUTIL cp "$ARCHIVE_PATH""$OSS_BUCKET" --force --bigfile-threshold 104857600 -j 3 >> "$LOG" 2>&1; then
    log"上传 OSS 失败"
    send_dingding "备份失败""步骤：上传 OSS\n错误：执行失败\n本地文件已保留：$ARCHIVE_PATH"
    exit 1
fi
log"上传至 OSS 成功：$OSS_BUCKET$ARCHIVE_NAME"

# ========================
# 4. 清理本地备份（OSS 成功后）
# ========================
rm -rf "$BACKUP_DIR"
rm -f "$ARCHIVE_PATH"
log"本地备份已清理，仅保留 OSS 版本"

# ========================
# 5. 统计耗时
# ========================
END_TIME=$(date +%s)
DURATION=$((END_TIME - START_TIME))
HOURS=$((DURATION / 3600))
MINUTES=$(((DURATION % 3600) / 60))
SECONDS=$((DURATION % 60))
DURATION_FORMAT="${HOURS}h${MINUTES}m${SECONDS}s"

# ========================
# 6. 发送成功通知
# ========================
send_dingding "备份成功""备份文件：$ARCHIVE_NAME\n大小：$ARCHIVE_SIZE\n耗时：$DURATION_FORMAT\n已上传至：$OSS_BUCKET"

log"=== 备份流程完成 ==="

